home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 361_01 / getlinen.c < prev    next >
C/C++ Source or Header  |  1991-09-18  |  2KB  |  69 lines

  1.  
  2. /* GetLineN.c ---> Ramdom Access a Text File by Line Number.
  3.  *
  4.  * Author: J.Ekwall                                     13 September 91
  5.  *
  6.  * Copyrighted to the Public Domain.  Unlimited Distribution Authorized.
  7.  *
  8.  * User Assumes All Risks/Liabilities.
  9.  *
  10.  * Last Update: 13 September 91/EK
  11.  */
  12.  
  13. #include <gadgets.h>
  14. #include <stdek.h>
  15. #include <stdio.h>
  16. #include <string.h>
  17.  
  18. int GetLineN(char *Line, int Which1)
  19. {
  20.     static int LastKnownLine    = 0;
  21.     static int LineInc          = 1;
  22.     static int NextLine         = 0;
  23.     static int EOFatLine        = 32500;
  24.     static long Lines[501];     /* List of File Jump Pointers */
  25.     static FILE *fp = NULL;
  26.     int c, i, j;
  27.     char *tp1;
  28.  
  29.  /* IF Initialize/Close */
  30.     if (Which1-- < 1) {
  31.        if (fp != NULL) fclose(fp); EOFatLine = 32500;
  32.        NextLine = LastKnownLine = 0; LineInc = 1; Lines[0] = 0L; 
  33.        if (Line != NULL && *Line && (fp = fopen(Line, "r")) IS NULL) 
  34.           return FALSE;
  35.        return TRUE;
  36.      }
  37.      
  38.  /* If Within Known Range */
  39.     if (Which1 <  0 || Which1 >= EOFatLine) { 
  40.        strcpy(Line,"~"); return FALSE; }
  41.     if (Which1 < LastKnownLine) {
  42.        if (Which1 != NextLine) {
  43.           i = Which1 / LineInc; fseek(fp, Lines[i], SEEK_SET);
  44.           i = Which1 % LineInc;
  45.        } else i = 0;
  46.        for ( ; i >= 0; i--) fgets(Line, 255, fp);
  47.        Line[strlen(Line)-1] = NULL; NextLine = ++Which1;
  48.        return TRUE;
  49.     }
  50.  
  51.  /* Not in Known Range */
  52.     i = LastKnownLine / LineInc;
  53.     if (Which1 != NextLine) {
  54.        fseek(fp,Lines[i],SEEK_SET); LastKnownLine = i * LineInc; }
  55.     while (LastKnownLine <= Which1) {
  56.        if (fgets(Line, 255, fp) IS NULL) {
  57.           EOFatLine=LastKnownLine; strcpy(Line, "~"); return FALSE; }
  58.        if (++LastKnownLine % LineInc IS 0) {
  59.           Lines[++i] = ftell(fp);
  60.           if (i IS 500) {               /* OverFlow --> Crunch List */
  61.              LineInc *= 2; for (i = 1; i <= 250; i++) Lines[i] = Lines[2*i];
  62.              i = 250;
  63.           }
  64.        }
  65.     }
  66.     Line[strlen(Line)-1] = NULL; NextLine = LastKnownLine; return TRUE;
  67. }
  68.  
  69.